<?php
/**
 * The MIT License
 *
 * Copyright (c) <year> <copyright holders>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * @author Damiano Ciarla
 * @package plugin
 * @subpackage log/class
 */
class Log
{
	/**
	 * Configurazione della plugin
	 *
	 * @var Log_Config
	 */
	private $_config;

	/**
	 * Connessione al database
	 *
	 * @var Log_Interface_Connection
	 */
	private $_dbConn;

	public function __construct(Log_Config $logConfig)
	{
		$this->_config = $logConfig;
	}

	/**
	 * Classe che inizializza il plugin iniziando a tracciare su database
	 * i log settati nella classe di configurazione
	 */
	public function capture()
	{
		// Verifico che almeno uno dei log da tracciare sia stato impostato
		if($this->_config->logError && $this->_config->logException)
		{
			// Verifico la connessione al database
			$this->_checkDatabase();

			// Se impostata lancio la cattura degli errori
			if ($this->_config->logError)
				set_error_handler(array($this, "error"), (($this->_config->errorTypes === null) ? E_ALL|E_STRICT : $this->_config->errorTypes));

			// Se impostata lancio la cattura delle eccezioni
			if ($this->_config->logException)
				set_exception_handler(array($this, "exception"));
		}
	}

	/**
	 * Restituisce il numero di errori presenti nella tabella dei log
	 *
	 * @return int
	 */
	public function countError($type = null)
	{
		return $this->_dbConn->countError($type);
	}

	/**
	 * Restituisce la lista degli errori paginata con la possibilità di aggiungere
	 * il filtro in base alla tipologia degli errori
	 *
	 * @return int
	 */
	public function getError($page = 1, $limit = 30, $type = null)
	{
		return $this->_dbConn->getError($page, $limit, $type);
	}

	/**
	 * Restituisce la lista delle tipologie di errore momerizzate dai log
	 *
	 * @return array
	 */
	public function getUniqueTypeError()
	{
		return $this->_dbConn->getUniqueTypeError();
	}

	/**
	 * Restituisce il numero di eccezioni presenti nella tabella dei log
	 *
	 * @return int
	 */
	public function countException()
	{
		return $this->_dbConn->countException();
	}

	/**
	 * Restituisce la lista delle eccezioni paginata
	 *
	 * @return int
	 */
	public function getException($page = 1, $limit = 30)
	{
		return $this->_dbConn->getException($page, $limit);
	}

	/**
	 * Metodo che si occupa di verificare la connessione al database e inizializzare
	 * quella specificata nel file di configurazione
	 */
	private function _checkDatabase()
	{
		// Recupero i dati di connessione al database
		list($connType, $host, $username, $password, $dbname) = $this->_config->_getConnection();

		// Verifico che sia stata specificata almeno un tipologia di connessione
		if(!$connType)
			throw new Exception_PluginLayout("", Log_Exception::NO_CONNECTION_SETTINGS);

		// Controllo quale tipologia di connessione è stata specificata
		switch($connType)
		{
			case Log_Config::BXD_DB_LIB :

				$this->_dbConn = new Log_Db_BxdDatabase($host, $username, $password, $dbname);

				break;

			case Log_Config::CONN_MYSQL :

				$this->_dbConn = new Log_Db_MySql($host, $username, $password, $dbname);

				break;
		}

		// Verifico la presenza delle tabelle sul database
		$this->_dbConn->checkTable($this->_config->prefixTable . "error", $this->_config->prefixTable . "exception");
	}

	/**
	 * Metodo chiamato ogni volta che si verifica un errore
	 *
	 * @param $error
	 */
	public function error($errno = null, $errstr = null, $errfile = null, $errline = null, $errcontext = null)
	{
		$this->_dbConn->storeError($errno, $errstr, $errfile, $errline, $errcontext);
	}

	/**
	 * Metodo chiamato ogni volta che si verifica un eccezione
	 *
	 * @param Exception $e
	 */
	public function exception(Exception $e)
	{
		$this->_dbConn->storeException($e);
	}
}
?>
